/**
 * @file Test_xxddd2.c
 * @author Linquan  
 * @brief 
 * @version 1.0
 * @date 2024-07-06
 * 
 * @copyright Copyright (c) 2024
 * 
 */


#include "app_config.h"
#if TEST_TINY_SCHEDULER


#include "sys_tick.h"


/* 声明一个 子任务类 在主任务中调用 */
TS_TASK_VAR_START (Sub_task)
    uint8_t count;
TS_TASK_VAR_END

/* 声明两个主任务类 */

/* 生产者任务类 */
TS_TASK_VAR_START(TASK_product)
   int number; 
   int restart;
TS_TASK_VAR_END

/* 消费者任务类 */
TS_TASK_VAR_START(TASK_consume)
  TS_TASK_VAR(Sub_task) task_sub;// 此处创建一个子任务类实例
  int number;
TS_TASK_VAR_END


/* 创建主任务实例 */
TS_TASK_VAR(TASK_product)  product_var;
TS_TASK_VAR(TASK_consume)  consume_var;


void func1()
{
    printf("sub func\n");
}

/**
 * @brief 子任务
 * 
 */
TS_TaskFunStart(Sub_task)
    B_YELLOW_PRINT("in sube func : count : %d \n", me.count);
TS_TaskFunEnd



/**
 * @brief 消费者任务
 *      等生产者开始进行累加，将生产者累加的值移动到consume_var.number中
 *      当生产者累加到10,调用一次子任务，让子任务的计数值在生产者的累加值上加10
 * 
 */

TS_TaskFunStart(TASK_consume)
 
    B_PURPLE_PRINT("consume start\n");
    while(1) 
    {
        TS_WaitUntil(product_var.number);
      
        consume_var.number = product_var.number;
        
        B_GREEN_PRINT(" consume_var.number:%d\n", consume_var.number);

        if(product_var.number >=5)
        {          
            product_var.number = 0;
            consume_var.task_sub.count =  consume_var.number +10;

            /* 调用子任务 */
            TS_CallSub(Sub_task, consume_var.task_sub);
        }
          
        if(product_var.restart == 1)
        {
            product_var.restart = 0;
            // 重载 生产者任务
            TS_MountTask(product_var);
        }

        TS_WaitX(__MS(500));
       
    }
TS_TaskFunEnd

/**
 * @brief 生产者任务
 *      在 product_var中 对 number累加
 *      每次累加后，放弃CPU，延时500ms
 *  
 */
TS_TaskFunStart(TASK_product)

    B_PURPLE_PRINT("----product start-------\n");
    TS_WaitX(__MS(1000));
    B_PURPLE_PRINT("product continue\n");

    while(1) 
    {     
        product_var.number++;
        
        B_PURPLE_PRINT("--product one\n");
        
        TS_WaitX(__MS(500));
      
        if(product_var.restart == 1)
        {
            B_PURPLE_PRINT("product task exit  \n");
            TS_Exit;
        }


        if( consume_var.task_sub.count  >= 20)
        {
            consume_var.task_sub.count = 0;
            /* 重启任务 */
            B_PURPLE_PRINT("product task restart  \n");
            product_var.restart =1;
            TS_Restart;
        }
    }
TS_TaskFunEnd



/**
 * @brief 时间戳回调函数
 * 
 */
static void Master_TS_tick_callbak()
{   
        TS_UpdateTimer(product_var);
        TS_UpdateTimer(consume_var);// 10ms tick
}
/**
 * @brief 调度框架时基初始化
 * 
 * @param ptr 
 */
void  Master_TS_Init(void *ptr)
{ 
    sys_timer_callback_add(&Master_TS_tick_callbak); // 赋值 定时器回调函数
}
EXPORT_Lv2_PREV(Master_TS_Init, NULL);



/**
 * @brief 任务运行
 * 
 * @param task_list_ptr 
 */
void runtasks(void *task_list_ptr)
{
    TS_RunTask(TASK_consume,consume_var);
    TS_RunTask(TASK_product,product_var);
}
EXPORT_Lv7_APP_MANGE(runtasks, NULL);





#endif

























